0x71552 - The very start of the first tiles. Note that graphics are compressed. 0x1B5A - The very start of the graphics decompression (ASM) Written/Discovered by Lin. Thanks to Coolboyman for ASM help when it was needed. GRAPHICS DECOMPRESSION 1B5A ldi a,(hl) ;load a with whatever byte is up for graphics 1B5B and a ;a AND 1 1B5C ret z ;if a AND 0xC0 is 0, meaning done compressing, quit 1B5D bit 7,a ;if the highest bit (x in x*******) is 0 1B5F jr z,1b73 ;jump to 1b73 (Prodedure to set vram data) 1B61 and a,7f ;a AND 0x7F 1B63 ld c,a ;load c with a - bytes to copy? 1B64 ldi a,(hl) ;load a with whatever byte is up for graphics 1B65 push hl ;store where its currently reading from the rom 1B66 ld l,a ;set the lower byte of the reading location to a 1B67 ld h,ff ;set the upper byte to ff 1B69 add hl,de ;add the vram writing location to hl. this should be ffxx, which would mean its setting the vram location to copy from. it will loop around 1B6A ldi a,(hl) ;load a with whats at hl, aka copy from vram 1B6B ld (de),a ;set byte in vram location to a 1B6C inc de ;increase the vram location to write to by 1 1B6D dec c ;decrease c by 1 1B6E jr nz,1b6a ;if z is true (c > 0), go back to 1b6a and continue copying 1B70 pop hl ;set the data reading location to what it was before the copy 1B71 jr 1b5a ;repeat the first process 1B73 ld c,a ;load c with a 1B74 ldi a,(hl) ;load a with whatever byte is up for graphics (increases) 1B75 ld (de),a ;set byte in vram location to a, the last read byte 1B76 inc de ;increase the vram location to write to by 1 1B77 dec c ;decrease c by 1 1B78 jr nz,1b74 ;if z is true (c > 0), go and finish the current graphics strip 1B7A jr 1b5a ;repeat the first process C# CODE public byte[] decompress(int location) { gb.BufferLocation = location; int writeLocation = 0; int tempRL = location; byte[] buffer = new byte[256 * 8]; byte c = 0; byte a = 0; while (true) { first: a = gb.ReadByte(); if (a == 0) break; if ((a >> 7) == 0) goto lblSet; a &= 0x7F; c = a; a = gb.ReadByte(); copy: buffer[writeLocation] = buffer[writeLocation - 1 - (0xFF - a)]; writeLocation++; c--; if (c > 0) goto copy; goto first; lblSet: c = a; lblSet2: a = gb.ReadByte(); buffer[writeLocation] = a; writeLocation++; c--; if (c > 0) goto lblSet2; goto first; } return buffer; }